﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace You2V.Data.Shared
{
    /// <summary>
    /// 2012版学生信息，在原有后台系统的学生表基础上进行了一些规范化
    /// 今后新录入学生信息以这个表为主
    /// </summary>
    public class StudentInfo2012 : ICloneable
    {
        public Guid ID { get; set; }               //内部用ID，本地生成
        public int tc_id { get; set; }             //学生顺序号，由服务器端生成，即原有后台tc_id
        //public string tc_area { get; set; }           //学生地区编号，即原有后台tc_area
        public Area StudentArea { get; set; }       //学生地区
        public string StudentNumber { get; set; }  //显示用的学生编号，如LS12002，前两位字母是县城编号，中间是年份，最后三位是顺序号
                                                    //多次上传的后面加B,C,D...区分
        public string FullName { get; set; }       //学生姓名(真实完整姓名)
        public string NickName { get; set; }       //学生别名(为了对外显示，如小红)
        public string Gender { get; set; }         //性别
        public DateTime BirthDate { get; set; }    //生日，注意只填写年月日，把时分秒部分变成0
        public string Nation { get; set; }         //民族，不用枚举，我们内部有个数据表，但是录入以后直接存字符串，以后用起来方便一些
        public SchoolInfo SchoolInfo { get; set; }    //学生所在学校
        //public int YearEnterTheSchool { get; set; }    //进入该学校的年份，如2011年入学，这样方便以后计算年级。
        public string ClassName { get; set; }          //班级,可按照如：高一1201班统一，一年后可以自动计算变成高二1201班
        public Address StudentAddress { get; set; }     //学生地址(一般是学校、年级形式)
        public string EmailAddress { get; set; }        //学生电子邮件 TODO: 界面上还没有对应， DB还没有保存
        public List<FamilyMember> FamilyMemberList { get; set; }        //家庭成员列表，暂定最多5个
        public string HomeAddressPostCode { get; set; }             //家庭地址邮编
        public string HomeDetailAddressText { get; set; }             //家庭详细地址
        public string HomeAddressTextForPublish { get; set; }       //家庭地址(对外发布用，可能隐藏一些细节)
        public string HomeIncomeSummary { get; set; }       //家庭经济收入, 会规范资料组要求提供较为规范的数据，如：家庭经济主要依靠父亲务农收入，约5000元/年。
        public string HouseStatus { get; set; }             //住房情况
        public string AssetStatus { get; set; }             //财产情况
        public string SponsorSuggestion { get; set; }       //建议资助标准
        public string RewardsJustGain { get; set; }         //上学期曾获何种奖励

        public bool LiveInSchool { get; set; }              //是否住校, bool用于Binding, 数据库存放 是/否
        public string LiveInSchoolString                    //是否住校， string
        {
            get
            {
                return LiveInSchool ? "是" : "否";
            }
            set
            {
                if (string.Equals(value, "是"))
                {
                    LiveInSchool = true;
                }
                else
                {
                    LiveInSchool = false;
                }
            }
        }              

        public string Volunteer { get; set; }               //家访志愿者信息(姓名和联系方式可以写在一起，多个人的话也写在一起)
        public string VolunteerReport { get; set; }         //家访报告
        public string SelfIntroduction { get; set; }        //学生自述
        public string TeacherFeedback { get; set; }         //班主任评语
        public string Picture1Title { get; set; }           //照片1标题
        public string Picture1URL_2012 { get; set; }        //照片1在2012系统中的URL, 同步以前可以是本地硬盘的一个文件，同步以后变成网络路径
        public string Picture1URL_v1 { get; set; }          //照片1在原有后台系统中的URL, 长度100
        public string Picture2Title { get; set; }           //照片1标题
        public string Picture2URL_2012 { get; set; }        //照片1在2012系统中的URL, 同步以前可以是本地硬盘的一个文件，同步以后变成网络路径
        public string Picture2URL_v1 { get; set; }          //照片1在原有后台系统中的URL, 长度100
        public int UploadStatus { get; set; }               //对应原有后台中的tc_up字段0：未审核， 1：审核不通过 2：审核通过, -1表示未上传到后台系统
        public string UploadStatusString
        {
            get
            {
                switch (UploadStatus)
                {
                    case -1:
                        return "未上传到后台系统";
                    case 0:
                        return "未审核";
                    case 1:
                        return "审核不通过";
                    case 2:
                        return "审核通过";
                    default:
                        return string.Empty;
                }
            }

            set
            {
                // 不做任何事情
            }
        }

        public int SponsorStatus { get; set; }              //对应原有后台中的tc_status字段0：没有资助人 1：已有资助意向（尚未确认）2：已经获得资助

        public string SponsorStatusString
        {
            get
            {
                switch (SponsorStatus)
                {
                    case 0:
                        return "没有资助人";
                    case 1:
                        return "已有资助意向";
                    case 2:
                        return "已经获得资助";
                    default:
                        return string.Empty;
                }
            }

            set
            {
                // 不做任何事情
            }
        }

        public string SponsorShipTracking { get; set; }       //资助状态跟踪，"未开始资助", "正常资助", "需要回访“,"资助完成"

        //弃用: "上学期成绩排名"
        //弃用：是否有辍学经历及简要说明
        //弃用：是否需要帮助生活费
        //弃用：辍学经历简单描述

        public StudentInfo2012()
        {
            ID = Guid.NewGuid();
            StudentAddress = new Address();
            SchoolInfo = new SchoolInfo();
            FamilyMemberList = new List<FamilyMember>();
        }

        //todo, 根据最新结构检查
        public object Clone()
        {
            return this.MemberwiseClone();
        }

        //todo, 根据最新结构检查
        public virtual bool Equals(StudentInfo2012 CompareTo)
        {
            if (this.ID != CompareTo.ID )
                return false;

            if (this.tc_id != CompareTo.tc_id )
                return false;

            if (this.StudentArea != CompareTo.StudentArea )     //todo
                return false;

            if (!string.Equals(this.StudentNumber,CompareTo.StudentNumber))
                return false;

            if (!string.Equals(this.FullName, CompareTo.FullName))
                return false;

            if (!string.Equals(this.NickName, CompareTo.NickName))
                return false;

            if (!string.Equals(this.Gender, CompareTo.Gender))
                return false;

            if (this.BirthDate != CompareTo.BirthDate )
                return false;

            if (!string.Equals(this.Nation, CompareTo.Nation))
                return false;

            if (this.SchoolInfo != CompareTo.SchoolInfo)      //todo
                return false;

            if (!string.Equals(this.ClassName, CompareTo.ClassName))
                return false;

            if (this.StudentAddress != CompareTo.StudentAddress)    //todo
                return false;

            if (this.EmailAddress != CompareTo.EmailAddress)
                return false;

            if (this.FamilyMemberList != CompareTo.FamilyMemberList)  //todo
                return false;

            if (!string.Equals(this.HomeAddressPostCode, CompareTo.HomeAddressPostCode))
                return false;

            if (!string.Equals(this.HomeDetailAddressText, CompareTo.HomeDetailAddressText))
                return false;

            if (!string.Equals(this.HomeAddressTextForPublish, CompareTo.HomeAddressTextForPublish))
                return false;

            if (!string.Equals(this.HomeIncomeSummary, CompareTo.HomeIncomeSummary))
                return false;

            if (!string.Equals(this.HouseStatus, CompareTo.HouseStatus))
                return false;

            if (!string.Equals(this.AssetStatus, CompareTo.AssetStatus))
                return false;

            if (!string.Equals(this.SponsorSuggestion, CompareTo.SponsorSuggestion))
                return false;

            if (!string.Equals(this.RewardsJustGain, CompareTo.RewardsJustGain))
                return false;

            if (this.LiveInSchool != CompareTo.LiveInSchool )
                return false;

            if (!string.Equals(this.Volunteer, CompareTo.Volunteer))
                return false;

            if (!string.Equals(this.VolunteerReport, CompareTo.VolunteerReport))
                return false;

            if (!string.Equals(this.SelfIntroduction, CompareTo.SelfIntroduction))
                return false;

            if (!string.Equals(this.TeacherFeedback, CompareTo.TeacherFeedback))
                return false;

            return true;
        }

        public void CleanEmptyFamilyMemberData()
        {
            for (int i = FamilyMemberList.Count - 1; i >= 0; i--)
            {
                if (FamilyMemberList[i].IsEmpty())
                {
                    FamilyMemberList.RemoveAt(i);
                }
            }
        }
        
    }

    /// <summary>
    /// 家庭成员
    /// </summary>
    public class FamilyMember
    {
        public FamilyMember()
        {
            ID = Guid.NewGuid();
        }

        /// <summary>
        /// 判断是否空数据，有些时候由于操作增加一行，但是完全没有数据，则不需要保存
        /// </summary>
        public bool IsEmpty()
        {
            if (string.IsNullOrWhiteSpace(RelationShip)
                && string.IsNullOrWhiteSpace(FullName)
                && string.IsNullOrWhiteSpace(Age)
                && string.IsNullOrWhiteSpace(Job)
                && string.IsNullOrWhiteSpace(HealthStatus)
                && string.IsNullOrWhiteSpace(JobOutOfHometown))
            {
                return true;
            }
            else
            {
                return false;
            }
        }

        public Guid ID { get; set; }                        //内部用ID，本地生成
        public string RelationShip { get; set; }           //关系，助学组会要求资料员按照规范的亲属关系输入，比如：父亲，母亲，祖父，外祖父，==，而不是爸爸，妈妈，爷爷，外公。
        public string FullName { get; set; }               //姓名(真实完整姓名)

        #region 别名(为了对外显示，如王**)
        // todo, 其实可能多个人都叫做王**了
        public string NickName
        {
            get
            {
                if (!string.IsNullOrWhiteSpace(FullName))
                    return FullName.Substring(0, 1);
                else
                    return string.Empty;
            }
        }
        #endregion

        public string Age { get; set; }                       //家访时候的年龄(前面必须有家访日期)， 暂时用string因为以前有把多个家属写在一起的情况
        public string Job { get; set; }                    //职业
        public string HealthStatus { get; set; }           //健康情况，健康情况建议可分为：健康，年老体弱，残疾，患有**病，==，总之希望规范，不要出现诸如：一般，还好，等这样说了等于没说的的情况。
        public string JobOutOfHometown { get; set; }       //外出打工情况
    }
}
